package cn.edu.dzkd.software.service;

import cn.edu.dzkd.software.mapper.UserMapper;
import cn.edu.dzkd.software.pojo.Role;
import cn.edu.dzkd.software.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.RequestBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserService {

    @Resource
    private UserMapper userMapper;  // spring框架自动生成了一个mapper对象，注入到此属性中

    public Map<String, Object> selectUsers(int page,
                                           String username,
                                           String departmentName,
                                           String roleName) {
        int index = (page - 1) * 10;                   // 根据页码计算出当前页的第一条数据下标
        Map<String, Object> map = new HashMap<>();
        List<User> users = userMapper.selectUsers(index,username,departmentName,roleName);    // 通过sql获取数据库pojo数据
        int counts = userMapper.selectUserCounts(username,departmentName,roleName);            // 通过sql获取总条数
        map.put("code", 0);           // layui默认返回0的状态为成功
        map.put("msg", "");           // layui不解析msg中的信息
        map.put("count", counts);     // 记录数据表中总条数
        map.put("data", users);       // 当前页的数据内容
        return map;
    }
//
    public Map<String, Object> selectUserById(String id) {
        User user = userMapper.selectUserById(id);

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", user);
        return map;
    }

    public Map<String, Object> deleteById(String id) {
        userMapper.deleteById(id);

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "删除成功");
        return map;
    }

    public Map<String, Object> insertUser(String username, String password) {
        userMapper.insertUser(username, password);

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "新增成功");
        return map;
    }

    public Map<String, Object> insertUserJSON(User user) {
        System.out.println("新增用户之前  id=" + user.getId());

        String password = user.getPassword();
        // 密码加密一次
        String password_md5 = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
        // 密码再加密一次
        String password_md5_02 = DigestUtils.md5DigestAsHex(password_md5.getBytes(StandardCharsets.UTF_8));
        // 还可以自定义加盐 salt处理，这里暂未演示
        user.setPassword(password_md5_02);

        userMapper.insertUserJSON(user);   // 用户的数据新增，这里新增的密码是加密之后的内容

        System.out.println("新增用户之后  id=" + user.getId());

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "新增成功");
        return map;
    }

    public Map<String, Object> updateById(User user) {
        userMapper.updateById(user);

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "更新成功");
        return map;
    }

    public Map<String, Object> updateUserJSON(User user) {
        Map<String, Object> map = new HashMap<>();
        System.out.println("更新用户之前  id=" + user.getId());

        String password = user.getPassword();
        // 密码加密一次
        String password_md5 = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
        // 密码再加密一次
        String password_md5_02 = DigestUtils.md5DigestAsHex(password_md5.getBytes(StandardCharsets.UTF_8));
        // 还可以自定义加盐 salt处理，这里暂未演示
        user.setPassword(password_md5_02);

        userMapper.updateUserJSON(user);   // 用户的数据更新，这里更新的密码是加密之后的内容

        System.out.println("更新用户之后  id=" + user.getId());
        map.put("code", 200);
        map.put("msg", "更新成功");
        return map;
    }

    public Map<String, Object> login(User user, HttpServletRequest request) {

        Map<String, Object> map = new HashMap<>();


        User user_result = userMapper.login(user.getUsername());  // 如果用户名不存在，则返回null

        if(user_result == null) {   // 如果用户名不存在
            map.put("code", 901);
            map.put("msg", "用户名不存在");
            return map;             // 如果执行这里的代码，后续的所有代码不再执行
        }

        String password = user.getPassword();  // 取出用户本次请求过来的明文密码
        // 密码加密一次
        String password_md5 = DigestUtils.md5DigestAsHex(password.getBytes(StandardCharsets.UTF_8));
        // 密码再加密一次
        String password_md5_02 = DigestUtils.md5DigestAsHex(password_md5.getBytes(StandardCharsets.UTF_8));

        if(!user_result.getPassword().equals(password_md5_02)) {  // 如果用户输入的密码两次MD5加密的结果，与数据库值不同，则密码错误
            map.put("code", 902);
            map.put("msg", "对不起，密码错误");
            return map;             // 如果执行这里的代码，后续的所有代码不再执行
        }

        map.put("code", 200);
        map.put("msg", "恭喜您，登录成功");
        request.getSession().setAttribute("user", user);   // 如果用户登录成功，则在session存放一个当前用户的信息，作为拦截比对内容
        return map;
    }
}
